<?php

if (!defined('RAPIDLEECH')) {
    require('../404.php');
    exit;
}

/* Index Function */ {
// THIS FILE CONTAINS GENERAL FUNCTION NEEDED 
// METHODS IN THIS FILE:
//   create_hosts_file()
//   login_check()
//   is_present()
//   is_notpresent()
//   insert_location()
//   pause_download()
//   cut_str()
//   cutter()
//   write_file()
//   read_file()
//   pre()
//   getmicrotime()
//   html_error()
//   sec2time()
//   bytesToKbOrMbOrGb()
//   updateListInFile()
//   _cmp_list_enums()
//   _create_list()
//   checkmail()
//   fixfilename()
//   getfilesize()
//   bytesToKbOrMb()
//   defport()
//   getSize()
//   purge_files()
//   purge_files_ip()
//   file_put_contents()
//   file_get_contents()
//   is__writable()
//
//   getNowzone()
//   checkExistence()
//   calcUsedSpace()
//   do_strtolower()
//   get_extension()
//   get_tpl()
//   urlcleaner()
//   trimlink()
//   xmlentities()
//   strip_quotes()
//   buildRetryform()
//   get_real_ip()
//   chk_this_ip()
//   ip counter
//   dcd()
//   mcd()
//   encEnti()
//   decEnti()
//   rotN()
//   encrypt()
//   decrypt()
//   autoNext()
//   getServerPlatf()
//   color_cpu()
//   count_age()
//   cek_worktime()
//   relink_path()
//   utf8_strrev()
//   checkStrict()
//   textarea()
//   ________()
}

function create_hosts_file($host_file = "hosts.php") {
    global $L;
    $fp = opendir(HOST_DIR . 'download/');
    while (($file = readdir($fp)) !== false) {
        if (substr($file, - 4) == ".inc") {
            require_once (HOST_DIR . 'download/' . $file);
        }
    }
    if (!is_array($host)) {
        print $L->say['no_host'];
    } else {
        $fs = fopen(HOST_DIR . 'download/' . $host_file, "wb");
        if (!$fs) {
            print $L->say['cant_write_host'];
        } else {
            fwrite($fs, "<?php\r\n\$host = array(\r\n");
            $i = 0;
            foreach ($host as $site => $file) {
                if ($i != (count($host) - 1)) {
                    fwrite($fs, "'" . $site . "' => '" . $file . "',\r\n");
                } else {
                    fwrite($fs, "'" . $site . "' => '" . $file . "');\r\n?>");
                }
                $i++;
            }
            closedir($fp);
            fclose($fs);
        }
    }
}

function login_check() {
	global $options;
	if ($options['login']) {
		function logged_user($ul) {
			foreach ($ul as $user => $pass) {
				if ($_SERVER['PHP_AUTH_USER'] == $user && $_SERVER['PHP_AUTH_PW'] == $pass) { return true; }
			}
			return false;
		}
		if ($options['login_cgi']) {
			list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = @explode(':', base64_decode(substr((isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : $_SERVER['REDIRECT_HTTP_AUTHORIZATION']), 6)), 2);
		}
		if (empty($_SERVER['PHP_AUTH_USER']) || !logged_user($options['users'])) {
			header ( 'WWW-Authenticate: Basic realm="Rx08"' );
			header ( "HTTP/1.0 401 Unauthorized" );
			get_tpl("deadpage", "NuLL");
			exit;
		}
	}
}

function is_present($lpage, $mystr, $strerror = "", $head = 0) {
    $strerror = $strerror ? $strerror : $mystr;
    if (stristr($lpage, $mystr)) {
        html_error($strerror, $head);
    }
}

function is_notpresent($lpage, $mystr, $strerror, $head = 0) {
    if (!stristr($lpage, $mystr)) {
        html_error($strerror, $head);
    }
}

function insert_location($newlocation) {
    if (isset($_GET ["GO"]) && $_GET ["GO"] == "GO") {
        list ( $location, $list ) = explode("?", $newlocation);
        $list = explode("&", $list);
        foreach ($list as $l) {
            list ( $name, $value ) = explode("=", $l);
            $_GET [$name] = $value;
        }
    } else {
        global $nn;
        list ( $location, $list ) = explode("?", $newlocation);
        $list = explode("&", $list);
        print "<form action=\"$location\" method=\"post\">" . $nn;
        foreach ($list as $l) {
            list ( $name, $value ) = explode("=", $l);
            print "<input type=\"hidden\" name=\"$name\" value=\"$value\" />" . $nn;
        }
        echo ('<script type="text/javascript">void(document.forms[0].submit());</script>');
        echo ('</form>');
        echo ('</body>');
        echo ('</html>');
        flush ();
    }
}

function pause_download() {
    global $pathWithName, $PHP_SELF, $_GET, $nn, $bytesReceived, $fs, $fp;
    $status = connection_status ();
    if (($status == 2 || $status == 3) && $pathWithName && $bytesReceived > - 1) {
        flock($fs, LOCK_UN);
        fclose($fs);
        fclose($fp);
    }
}

function cut_str($str, $left, $right) {
    $str = substr(stristr($str, $left), strlen($left));
    $leftLen = strlen(stristr($str, $right));
    $leftLen = $leftLen ? - ($leftLen) : strlen($str);
    $str = substr($str, 0, $leftLen);
    return $str;
}

// tweaked cutstr with pluresearch functionality
function cutter($str, $left, $right, $cont=1) {
    for ($iii = 1; $iii <= $cont; $iii++) {
        $str = substr(stristr($str, $left), strlen($left));
    }
    $leftLen = strlen(stristr($str, $right));
    $leftLen = $leftLen ? - ($leftLen) : strlen($str);
    $str = substr($str, 0, $leftLen);
    return $str;
}

function write_file($file_name, $data, $trunk = 1) {
    if ($trunk == 1) {
        $mode = "wb";
    } elseif ($trunk == 0) {
        $mode = "ab";
    }
    $fp = fopen($file_name, $mode);
    if (!$fp) {
        return FALSE;
    } else {
        if (!flock($fp, LOCK_EX)) {
            return FALSE;
        } else {
            if (!fwrite($fp, $data)) {
                return FALSE;
            } else {
                if (!flock($fp, LOCK_UN)) {
                    return FALSE;
                } else {
                    if (!fclose($fp)) {
                        return FALSE;
                    }
                }
            }
        }
    }
    return TRUE;
}

function read_file($file_name, $count = -1) {
    if ($count == - 1) {
        $count = filesize($file_name);
    }
    $fp = fopen($file_name, "rb");
    flock($fp, LOCK_SH);
    $ret = fread($fp, $count);
    flock($fp, LOCK_UN);
    fclose($fp);
    return $ret;
}

function pre($var) {
    echo "<pre>";
    print_r($var);
    echo "</pre>";
}

function getmicrotime() {
    list ( $usec, $sec ) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

function html_error($msg, $retry = 0) {
    global $PHP_SELF, $options, $L, $RL_VER, $nn;
    //if ($head == 1)
    if (!headers_sent ()) {
        $litehead = 1;
        include(TEMPLATE_DIR . 'header.php');
    }

    echo ('<div align="center">');
    echo ('<span class="htmlerror"><b>' . $msg . '</b></span><br /><br />');

    if ($retry == 1) {
        echo buildRetryform(15);
    }

    echo ('<a id="tdone" href="' . $PHP_SELF . '"><b>' . $L->say['back_main'] . '</b></a>');
    echo ('</div>');
    echo ($nn . '</body></html>');

    //include(TEMPLATE_DIR.'footer.php');
    exit ();
}

function sec2time($time) {
    global $L;
    $day = round($time / (3600 * 24), 2);
    if ($day >= 1) {
        $day = floor($day);
        $time -= $day * 3600 * 24;
    }
    $hour = round($time / 3600, 2);
    if ($hour >= 1) {
        $hour = floor($hour);
        $time -= $hour * 3600;
    }
    $min = round($time / 60, 2);
    if ($min >= 1) {
        $min = floor($min);
        $time -= $min * 60;
    }
    $sec = $time;
    $day = ( ($day > 1) ? $day . " " . $L->say['days'] . " " : (($day == 1) ? $day . " " . $L->say['days'] . " " : "") );
    $hour = ($hour > 1) ? $hour . " " . $L->say['hours'] . " " : ($hour == 1) ? $hour . " " . $L->say['hours'] . " " : "";
    $min = ($min > 1) ? $min . " " . $L->say['minutes'] . " " : ($min == 1) ? $min . " " . $L->say['minutes'] . " " : "";
    $sec = ($sec > 1) ? $sec . " " . $L->say['seconds'] : ($sec == 1 || $sec == 0) ? $sec . " " . $L->say['seconds'] : "";
    return $day . $hour . $min . $sec;
}

// Updated function to be able to format up to Yotabytes!
function bytesToKbOrMbOrGb($bytes) {
    if (is_numeric($bytes)) {
        $s = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
        $e = floor(log($bytes) / log(1024));
        //return sprintf ( '%.2f ' . $s [$e], @($bytes / pow ( 1024, floor ( $e ) )) );
        return (pow(1024, floor($e)) > 0 ? sprintf('%.2f ' . $s[$e], ($bytes / pow(1024, floor($e)))) : '0 B');
    } else {
        //$size = "Unknown";
        $size = sprintf("%u", filesize($file));
    }
    return $size;
}

function updateListInFile($list) {
    if (is_array($list) && count($list) > 0) {
        foreach ($list as $key => $value) {
            $list [$key] = serialize($value);
        }
        //echo file_put_contents ( FILES_LST, implode ( "\r\n", $list ) . "\r\n" );
        if (!file_put_contents(FILES_LST, implode("\r\n", $list) . "\r\n") && count($list) > 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    } elseif (@file_exists(FILES_LST)) {
        // Truncate files.lst instead of removing it since we don't have full
        // read/write permission on the configs folder
        $fh = fopen(FILES_LST, 'w');
        fclose($fh);
        return true;
    }
}

function _cmp_list_enums($a, $b) {
    //return strcmp ( $a ["name"], $b ["name"] );
    if (isset($a["date"]) && isset($b["date"])) {
        return strcmp($a["date"], $b["date"]);
    } else {
        return strcmp($a["name"], $b["name"]);
    }
}

function _create_list($lynx = false, $medic=false, $d_showall=false) {
    global $list, $_COOKIE, $options;
    $glist = array();
    //$unix_now = ( TIME_NOW - date("Z") + (3600 * $options["timezone"]));
    if (!$d_showall)
        $d_showall = (isset($_COOKIE["showAll"]) ? $_COOKIE["showAll"] : false);
    if (($options["show_all"] && ($d_showall == 1)) || $medic) {
        // Show Everything
        if (!defined("ROOT_DIR")) {
            define('ROOT_DIR', realpath("./"));
        }

        $inCurrDir = stristr(dirname(DOWNLOAD_DIR), ROOT_DIR) ? TRUE : FALSE;
        $totsize = 0;
        $cnt = 0;
        $dir = @dir(DOWNLOAD_DIR);
        while (false !== ($file = $dir->read())) {
            if ($file != "." && $file != ".." && is_array($options["forbidden_filetypes"]) &&
                    !in_array("." . get_extension($file), $options["forbidden_filetypes"]) &&
                    is_file(DOWNLOAD_DIR . $file) &&
                    basename($file) != basename(FILES_LST) &&
                    basename($file) != 'index.html' &&
                    basename($file) != 'index.php'
            ) {
                $file = DOWNLOAD_DIR . $file;
                $time = (($inCurrDir != TRUE) ? @filemtime(DOWNLOAD_DIR . basename($file)) : @filemtime($file));
                $time = getNowzone($time);
                //$unix_zone = ( $time - date("Z") + (3600 * $options["timezone"]));
                while (isset($glist[$time]))
                    $time++;
                $size = getfilesize($file);
                $agefile = (TIME_NOW - $time);
                $glist[$time] = array(
                    "name" => realpath($file),
                    "size" => bytesToKbOrMbOrGb($size),
                    "date" => $time,
                    "age" => count_age($agefile),
                );
                if ($options["show_column_sfile"]["md5"] && !$lynx)
                    $glist[$time]["md5"] = md5_file($file);
                $totsize+=$size;
                $cnt++;
            }
        }
        $dir->close();
        @uasort($glist, "_cmp_list_enums");
        if ($cnt > 0) {
            $glist["files"]["totalsize"] = $totsize;
            $glist["files"]["totalfile"] = $cnt;
            $glist["files"]["misc"] = "files";
        }
    } elseif ($options["downloadLimitbyip"]) {
        if (@file_exists(IP_L33CH_L0G)) {
            $glist = file(IP_L33CH_L0G);
            $glistReformat = null;
            foreach ($glist as $key => $record) {
                foreach (unserialize($record) as $field => $value) {
                    $listReformat[$key][$field] = $value;
                    if ($field == "date") $date = $value;
                }
                $glist[$date] = $listReformat[$key];
                unset($glist[$key], $glistReformat[$key]);
            }
        }
    } else {

        // Show Downloaded
        if (@file_exists(FILES_LST)) {
            $glist = file(FILES_LST);
            $glistReformat = null;
            foreach ($glist as $key => $record) {
                $recfile = @unserialize($record);
                if (is_array($recfile)) {
                    foreach ($recfile as $field => $value) {
                        if (in_array($field, array("date", "age", "misc"))) {
                            $time = getNowzone(@filemtime($recfile["name"]));
                            //$unix_zone = ($time != $value ? $time - date("Z") + (3600 * $options["timezone"]) : $value);
                            if ($field == "age") {
                                $agefile = (TIME_NOW - $time);
                                $listReformat[$key]["age"] = count_age($agefile);
                            }
                            if ($field == "date") {
                                $listReformat[$key][$field] = $time;
                                $date = $time;
                            }
                        }
                        if ($field != "age" && $field != "date")
                            $listReformat[$key][$field] = $value;
                    }
                    $glist[$date] = $listReformat[$key];
                    unset($glist[$key], $glistReformat[$key]);
                }
            }
            @uasort($glist, "_cmp_list_enums");
        }
    }
    $list = $glist;
}

function checkmail($mail) {
    if (strlen($mail) == 0) {
        return false;
    }
    if (!preg_match("/^[a-z0-9_\.-]{1,20}@(([a-z0-9-]+\.)+(com|net|org|mil|" . "edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-" . "9]{1,3}\.[0-9]{1,3})$/is", $mail)) {
        return false;
    }
    return true;
}

/* Fixed Shell exploit by: icedog */
function fixfilename($fname, $fpach = '') {
	$f_name = basename ( $fname );
	$f_dir = dirname ( preg_replace ( "@\.\./@i", "", $fname ) );
	$f_dir = ($f_dir == '.') ? '' : $f_dir;
	$f_dir = preg_replace ( "@\.\./@i", "", $f_dir );
	$fpach = preg_replace ( "@\.\./@i", "", $fpach );
	$f_name = preg_replace ( "@\.(php|hta|pl|cgi|sph)@i", ".xxx", $f_name );
	$ret = ($fpach) ? $fpach . DIRECTORY_SEPARATOR . $f_name : ($f_dir ? $f_dir . DIRECTORY_SEPARATOR : '') . $f_name;
	return $ret;
}

function getfilesize($f) {
    global $is_windows;
    $stat = stat($f);

    if ($is_windows)
        return sprintf("%u", $stat [7]);
    if (($stat [11] * $stat [12]) < 4 * 1024 * 1024 * 1024)
        return sprintf("%u", $stat [7]);

    global $max_4gb;
    if ($max_4gb === false) {
        $tmp_ = trim(@shell_exec(" ls -Ll " . @escapeshellarg($f)));
        while (strstr($tmp_, '  ')) {
            $tmp_ = @str_replace('  ', ' ', $tmp_);
        }
        $r = @explode(' ', $tmp_);
        $size_ = $r [4];
    } else {
        $size_ = - 1;
    }

    return $size_;
}

function bytesToKbOrMb($bytes) {
    $size = ($bytes >= (1024 * 1024 * 1024 * 1024)) ? round($bytes / (1024 * 1024 * 1024 * 1024), 2) . " TB" : (($bytes >= (1024 * 1024 * 1024)) ? round($bytes / (1024 * 1024 * 1024), 2) . " GB" : (($bytes >= (1024 * 1024)) ? round($bytes / (1024 * 1024), 2) . " MB" : round($bytes / 1024, 2) . " KB"));
    return $size;
}

function defport($urls) {
    if ($urls ["port"] !== '' && isset($urls ["port"]))
        return $urls ["port"];

    switch (strtolower($urls ["scheme"])) {
        case "http" :
            return '80';
        case "https" :
            return '443';
        case "ftp" :
            return '21';
    }
}

function getSize($file) {
    $size = filesize($file);
    if ($size < 0)
        if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) {
            $size = trim(`stat -c%s $file`);
        } else {
            $fsobj = new COM("Scripting.FileSystemObject");
            $f = $fsobj->GetFile($file);
            $size = $file->Size;
        }
    return $size;
}

function purge_files($delay) {
    global $options;
    if (file_exists(FILES_LST) && is_numeric($delay) && $delay > 0) {

        $files_lst = file(FILES_LST);
        $files_new = "";
        $deleted["count"] = 0;
        $deleted["files"] = array();
        foreach ($files_lst as $files_line) {
            $files_data = unserialize(trim($files_line));
            if (isset($files_data["name"]) && @file_exists($files_data["name"]) && is_file($files_data["name"])) {
                $filedate = getNowzone(@filemtime($files_data["name"]));
                if ((TIME_NOW - $filedate) >= ($delay * 3600)) {
                    @unlink($files_data["name"]);
                    $deleted["count"]++;
                    $deleted["files"][] = $options["download_dir"] . basename($files_data["name"]);
                } else {
                    $files_new .= $files_line;
                }
            }
        }
        file_put_contents(FILES_LST, $files_new);
    }
    purge_files_ip($delay);
    //return $cnt_deleted;
    return $deleted;
}

// Delete ip log user download
function purge_files_ip($delay) {
    if (file_exists(IP_L33CH_L0G) && is_numeric($delay) && $delay > 0) {
        $files_lst = file(IP_L33CH_L0G);
        $files_new = "";
        foreach ($files_lst as $files_line) {
            $files_data = unserialize(trim($files_line));
            $filedate = getNowzone(@filemtime($files_data["name"]));
            if (TIME_NOW - $filedate < ($delay * 3600)) {
                $files_new .= $files_line;
            }
        }
        file_put_contents(IP_L33CH_L0G, $files_new);
    }
}

// PHP4 compatibility
if (!function_exists("file_put_contents") && !defined("FILE_APPEND")) {
    define("FILE_APPEND", 1);

    function file_put_contents($n, $d, $flag = false) {
        $mode = ($flag == FILE_APPEND || strtoupper($flag) == "FILE_APPEND") ? "a" : "w";
        $f = @fopen($n, $mode);
        if ($f === false) {
            return 0;
        } else {
            if (is_array($d)) {
                $d = implode($d);
            }
            $bytes_written = fwrite($f, $d);
            fclose($f);
            return $bytes_written;
        }
    }

}

if (!function_exists("file_get_contents")) {

    function file_get_contents($filename, $incpath = false) {
        if (false === $fh = fopen($filename, "rb", $incpath)) {
            trigger_error("file_get_contents() failed to open stream: No such file or directory", E_USER_WARNING);
            return false;
        }
        clearstatcache ();
        if ($fsize = @filesize($filename)) {
            $data = fread($fh, $fsize);
        } else {
            $data = "";
            while (!feof($fh)) {
                $data .= fread($fh, 8192);
            }
        }
        fclose($fh);
        return $data;
    }

}

// Using this function instead due to some compatibility problems
function is__writable($path) {
    //will work in despite of Windows ACLs bug
    //NOTE: use a trailing slash for folders!!!
    //see http://bugs.php.net/bug.php?id=27609
    //see http://bugs.php.net/bug.php?id=30931

    if ($path {strlen($path) - 1} == '/') // recursively return a temporary file path
        return is__writable($path . uniqid(mt_rand()) . '.tmp');
    else if (is_dir($path))
        return is__writable($path . '/' . uniqid(mt_rand()) . '.tmp');
    // check tmp file for read/write capabilities
    $rm = file_exists($path);
    $f = @fopen($path, 'a');
    if ($f === false)
        return false;
    fclose($f);
    if (!$rm)
        unlink($path);
    return true;
}

// This function manualy set server timezone, 
// believe or not triggering date_default_timezone_set() may perform lil faster in manipulating date()
function getNowzone($t='') {
    global $options;
    if ($t == '')
        $t = time();
    // incompatibile for PHP4
    if (!function_exists("date_default_timezone_set") || !function_exists("date_default_timezone_get")) {
        $nowzone = $t;
    } elseif ($options["timezone"] > 0) {
        date_default_timezone_set('UTC');
        //$nowzone = strtotime(date("Y M d H:i:s", time() - date("Z") + (3600 * $options["timezone"]) ) );
        $nowzone = ($t + round(3600 * $options["timezone"], 0) );
    } else {
        date_default_timezone_set(date_default_timezone_get());
        $nowzone = $t;
    }
    return $nowzone;
}

// This function check primary file and folder
// returned filesize of the FILES_LST
function checkExistence() {
    global $L;
    //Checking DOWNLOAD_DIR
    if (file_exists(DOWNLOAD_DIR)) {
        if (!is__writable(DOWNLOAD_DIR)) {
            html_error($L->sprintf($L->say['not_writable'], DOWNLOAD_DIR));
        }
    } else {
        html_error($L->sprintf($L->say['dir_not_exists'], DOWNLOAD_DIR));
    }

    // Check FILES_LST is not writable,
    if (file_exists(FILES_LST)) {
        if (!is__writable(FILES_LST)) {
            html_error($L->sprintf($L->say['not_writable'], FILES_LST));
        }
        return @filesize(FILES_LST);
    } else {
        html_error($L->sprintf($L->say['file_not_exists'], FILES_LST));
    }
}

function calcUsedSpace() {
    global $list;
    $total_size = 0;
    if (!$list) {
        _create_list ();
    }
    if (isset($list["files"]["totalsize"])) {
        $total_size = $list["files"]["totalsize"];
    } else {
        foreach ($list as $key => $file) {
            if (@file_exists($file ["name"])) {
                $total_size += filesize($file ["name"]);
            }
        }
    }
    return $total_size;
}

/* lowers the case of a string, mb strings accounted for */

function do_strtolower($string) {
    if (function_exists("mb_strtolower")) {
        $string = mb_strtolower($string);
    } else {
        $string = strtolower($string);
    }
    return $string;
}

/* Returns the extension of a file. */

function get_extension($file) {
    return do_strtolower(substr(strrchr($file, "."), 1));
}

/* Render (dead) template needed */

function get_tpl($keyname, $msg="Halted") {
    global $RL_VER, $options, $charSet, $nn;
    //error_reporting(E_ALL);

    $dead_msg = $msg;
    if (file_exists(ROOT_DIR . TEMPLATE_DIR . $keyname . ".php")) {
        require_once(ROOT_DIR . TEMPLATE_DIR . $keyname . ".php");
    } else {
        require_once(ROOT_DIR . CLASS_DIR . $keyname . ".php");
    }
}

// Clean Link from * if any. //kaskus filter
function urlcleaner($url) {
    if (strpos($url, "*")) {
        return str_replace("*", "", $url);
    } else {
        return $url;
    }
}

// Limit long path download link
function trimlink($link) {
    $max = 50;
    $range = 5;
    if (strlen($link) > ($max + $range)) {
        $opr = '://';
        $stfrom = (strpos($link, $opr) + strlen($opr) + 1);
        // get the host name
        $lhost = substr($link, 0, strpos(substr($link, $stfrom), "/") + $stfrom);
        $partlnk = explode("/", $link);
        $fname = $partlnk[count($partlnk) - 1];
        // trim filename
        if (strlen($lhost . $fname) > $max) {
            $fname = '&#8230;' .
                    substr($fname, strlen($lhost . $fname) - $max, strlen($fname));
        }
        return $lhost . '/&#8230;/' . $fname;
    } else {
        return $link;
    }
}

// XML Entity Mandatory Escape Characters
function xmlentities($string, $entities=true) {
    $string = ($entities ? htmlentities($string) : $string);
    return str_replace(array('&', '"', "'", '<', '>', ' '), array('&amp;', '&quot;', '&apos;', '&lt;', '&gt;', '&#32;'), $string);
}

// Inspector strip quotes Characters
function strip_quotes($string) {
    return str_replace(array('"', "'", ' '), array('_', '_', '_'), $string);
}

// Return form for html_error for retry free download mode
function buildRetryform($delay = 15) {
    global $PHP_SELF, $LINK, $L;
    $form = '';
    $form .= ( '<script type="text/javascript">');
    $form .= ( 'var d=document, di=' . $delay . '; // in second');
    $form .= ( 'function itung(){if(di>0){setTimeout("itung()",1000); di--;');
    $form .= ( 'd.getElementById("tmr").innerHTML=di; } else');
    $form .= ( '{ d.frmretry.submit(); }}setTimeout("itung()", 1000);');
    $form .= ( '</script>');
    $form .= ( $L->say['try_free_dl'] . '[<b id="tmr" class="g">~</b>]&nbsp;');
    $form .= ( '<a href="javascript:;" onclick=\"document.frmretry.submit();\">');
    $form .= ( '[' . $L->say['execute'] . ']</a><br /><br />');
    $form .= ( '<form name="frmretry" action="' . $PHP_SELF . '" method="post">');
    $form .= ( '<input type="hidden" name="link" value="' . $LINK . '" />');
    $keyname = array('premium_acc', 'mu_acc', 'hf_acc', 'rs_acc');
    foreach ($keyname as $k => $v) {
        $form .= ( '\n<input type="hidden" name="' . $v . '" value=""/>');
    }
    return $form;
}

// Get real IP
function get_real_ip() {
    $ipRL = false;
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ipRL = $_SERVER['HTTP_CLIENT_IP'];
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
        if ($ipRL) {
            array_unshift($ips, $ipRL);
            $ipRL = false;
        }
        for ($i = 0; $i < count($ips); $i++) {
            if (!preg_match("/^(10|172\.16|192\.168)\./i", $ips[$i])) {
                if (version_compare(phpversion(), "5.0.0", ">=")) {
                    if (ip2long($ips[$i]) != false) {
                        $ipRL = $ips[$i];
                        break;
                    }
                } else {
                    if (ip2long($ips[$i]) != - 1) {
                        $ipRL = $ips[$i];
                        break;
                    }
                }
            }
        }
    }
    return ($ipRL ? $ipRL : $_SERVER['REMOTE_ADDR']);
}

//Check allow / Banned IP Address
function chk_this_ip($meth, $user_ip) {
    global $options, $L;
    $ip_allow_ar = array();
    if ($meth == 'is_baned') {
        $list_ip = $options["list_baned_ip"];
    } elseif ($meth == 'is_allow') {
        $list_ip = $options["list_allow_ip"];
    }
    $ip_allow_ar = explode(',', $list_ip);
    ksort($ip_allow_ar);
    $check_is = false;
    $ada_bintang = 0;
    $i = 0;
    if ($meth == 'is_allow' && !$ip_allow_ar[$i]) {
        html_error($L->say['malfunction_ip']);
    }
    while (!$check_is && ($ip_allow_ar[$i])) {
        $ada_bintang = ($ip_allow_ar[$i] != '*.*.*.*' ? substr_count($ip_allow_ar[$i], '.*') : 4);
        if ($ada_bintang > 0) {
            if ($ada_bintang != 4) {
                $sub_ip = substr($ip_allow_ar[$i], 0, strpos($ip_allow_ar[$i], '.*')) . ".";
                $u_ip_ar = explode('.', $user_ip);
                $bit = (int) (3 - $ada_bintang);
                $u_ip = '';
                for ($j = 0; $j <= $bit; $j++) {
                    $u_ip = $u_ip . $u_ip_ar[$j] . ".";
                }
                if (trim($u_ip) == trim($sub_ip)) {
                    $check_is = true;
                }
            } else {
                $check_is = true;
            }
        } else {
            if (trim($user_ip) == trim($ip_allow_ar[$i])) {
                $check_is = true;
            }
        }
        $i++;
    }
    return $check_is;
}

function ipcounter() {
    global $heute, $options, $ipmu;
    $xhandle = @opendir("tmp");
    if ($xhandle) {
        while ($buin = readdir($xhandle)) {
            if (preg_match("@$ipmu@i", $buin)) {
                $heute = $heute + 1;
            }
        }
        $ckusr = decEnti((string) base64_decode(urldecode($_COOKIE['rxyzusr'])));
        $ckusr = (is_numeric($ckusr) ? $ckusr : '0');
        if (($ckusr != '') && ($ckusr > $heute)) {
            $heute = $ckusr;
        } else {
            setcookie('rxyzusr', base64_encode(encEnti((string) $heute)), TIME_NOW + ($options["delay_per_ip"] * 60 * 60));
        }
        closedir($xhandle);

        error_reporting(0);
        $time = TIME_NOW;
        $xhandle = @opendir("tmp");
        while ($buin = readdir($xhandle)) {
            if ($buin == "." || $buin == "..") {
                $buin = "fu";
            }
            $xd = getNowzone(filemtime("tmp/$buin"));
            $altr = $time - $xd;
            if ($altr > $options["delay_per_ip"] * 60 * 60) {
                if (is_dir("tmp/$buin")) {
                    rmdir("tmp/$buin");
                } else {
                    unlink("tmp/$buin");
                }
            }
        }
        closedir($xhandle);
        error_reporting(1);
    }
}

//encryption
function dcd($c) {
    $pt = "";
    $bfC = $c;
    if ($c == "") {
        return $pt;
    }
    $rRot = (int) substr($c, -2);
    if (!is_numeric($rRot)) {
        return false;
    } else {
        $bfC = strtoupper(substr($c, 0, -2));
        $pj = strlen($bfC);
        $i = 0;
    }
    if ($pj % 2 != 0) {
        return false;
    }
    while ($i < $pj) {
        $hs = chr(hexdec(substr($bfC, $i, 2)));
        $pt.=$hs;
        $i = $i + 2;
    }
    $pt = strrev(rotN($pt, -$rRot));
    return $pt;
}

function mcd($armacc) {
    $dar = array();
    $n_a = count($armacc);
    for ($i = 0; $i < $n_a; $i++) {
        $buf_ac = array();
        $cl_all = array();
        $buf_ac = explode(chr(hexdec("3A")), dcd($armacc[$i]));
        $cl_all["user"] = $buf_ac[0];
        $cl_all["pass"] = $buf_ac[1];
        $dar[] = $cl_all;
    }
    return $dar;
}

function encEnti($v) {
    $rt = "";
    for ($i = 0; $i < strlen($v); $i++) {
        $ktr = strtoupper(dechex(ord($v{$i})));
        $rt.=$ktr;
    }
    return $rt;
}

function decEnti($c) {
    $pt = "";
    $pj = strlen($c);
    $i = 0;
    if ($pj % 2 != 0) {
        return false;
    }
    while ($i < $pj) {
        $hs = chr(hexdec(substr($c, $i, 2)));
        $pt.=$hs;
        $i = $i + 2;
    }
    return $pt;
}

function rotN($s, $n) {
    $s2 = "";
    for ($i = 0; $i < strlen($s); $i++) {
        $char2 = $char = ord($s{$i});
        $cap = $char & 32;
        $char &= ~ $cap;
        $char = $char > 64 && $char < 123 ? (($char - 65 + $n) % 26 + 65) : $char;
        $char |= $cap;
        if ($char < 65 && $char2 > 64 || ($char > 90 && $char < 97 && ($char2 < 91 || $char2 > 96)))
            $char += 26;
        else if ($char > 122 && $char2 < 123)
            $char -= 52;
        if (strtoupper(chr($char2)) === chr($char2))
            $char = strtoupper(chr($char)); else
            $char = strtolower(chr($char));
        $s2 .= $char;
    }
    return $s2;
}

#need to keep premium account cookies safe!
function encrypt($string)
{
	global $secretkey;
	if (!$secretkey) return html_error('Value for $secretkey is empty, please create a random one (56 chars max) in accounts.php!');
	require_once 'class.pcrypt.php';

	/*
	MODE: MODE_ECB or MODE_CBC
	ALGO: BLOWFISH
	KEY:  Your secret key :) (max lenght: 56)
	*/
	$crypt = new pcrypt(MODE_CBC, "BLOWFISH", "$secretkey");

	// to encrypt
	$ciphertext = $crypt->encrypt($string);

	return $ciphertext;
}

function decrypt($string)
{
	global $secretkey;
	if (!$secretkey) return html_error('Value for $secretkey is empty, please create a random one (56 chars max) in accounts.php!');
	require_once 'class.pcrypt.php';

	/*
	MODE: MODE_ECB or MODE_CBC
	ALGO: BLOWFISH
	KEY:  Your secret key :) (max lenght: 56)
	*/
	$crypt = new pcrypt(MODE_CBC, "BLOWFISH", "$secretkey");

	// to decrypt
	$decrypted  = $crypt->decrypt($string);

	return $decrypted;
}

/* ==========
  autoNext function
  param:
  $iset : should it set autoDL true or not
  $forceNext: if download found error keep evaluate next link
  $audl: wot method send from audl.php. eg. sims, queue, manual
  ========== */

function autoNext($iset, $forceNext, $audl) {
    global $options;
    $bfRet = "";
    $bfRet = "\r\n<script type='text/javascript'>\n";
    $bfRet.="try{if(parent.isAuto==true){id=parent.current_dlink;\n";
    $bfRet.="parent.startisdone(id);}\nelse{\n id=self.name.substring(self.name.length-1); idLnk=parent.document.getElementById('idxlink'+id).innerHTML; parent.iframeReady(id); idx=eval(idLnk-1); parent.startisdone(idx);\n}\n}\ncatch(e){}\n";
    if ($audl != "") {
        if ($audl == "sims") {
            $bfRet.="id=self.name;id=id.substring(id.length-1);\n";
            $bfRet.="if(window.opener!=null){window.opener.startisdone(id);}\n";
        } elseif ($audl == "queue" || $audl == "manual") {
            $bfRet.="try{id=parent.current_dlink;\n";
            $bfRet.="parent.startisdone(id);}catch(e){}\n";
        }
    }
    $bfRet.="</script>\r\n";

    if ($iset) {
        $bfRet.="\r\n<script type='text/javascript'>var autoDL = true;\n";
    } else {
        $bfRet.= "\r\n<script type='text/javascript'>var autoDL;\n";
    }
    switch ($audl) {
        case "sims" :
            $bfRet.= "var not_simultan = false;";
            break;
        default :
            $bfRet.= "var not_simultan = true;";
            break;
    }

    if ($options["showautoclose"] == "true" && $forceNext) {
        $bfRet.="\r\n<!-- \n var time = " . $options["timeautoclose"] . ";\nif(autoDL==true && not_simultan){parent.nextlink(id);}\nfunction vbaccept(){\ntime--;frm = document.vbaccept;\nif(frm)frm.submit.value = 'Auto-Close through '+time+'';\n";
        $bfRet.="if(time>0){window.setTimeout(\"vbaccept()\",1);}\n else \nif(frm){frm.submit.value = 'done';\nfrm.submit.disabled=0;window.close(self);}}\n";
        if ($audl == 'sims') {
            $bfRet.="if(autoDL==true && not_simultan==false){ if(window.opener!=null){vbaccept(); var da = document.getElementById('tdone'); da.href='javascript:if(autoDL==true && not_simultan){window.opener.nextlink(id);}window.close(self);'; document.getElementById('txtdone').innerHTML='Done';}}\n\n";
        }
        $bfRet.="--></script>";
        $bfRet.="<form id=vbaccept name=vbaccept><input type=submit name=submit style='color:#fff;' value=\"done\" disabled></form>";
    } else {
        $bfRet.="\r\nif(autoDL==true && not_simultan){parent.nextlink(id);}\n if(autoDL==true && not_simultan==false){if(window.opener!=null){\r\n var da = document.getElementById('tdone');  \n da.href='javascript:if(autoDL==true && not_simultan){window.opener.nextlink(id);} window.close(self);';\n document.getElementById('txtdone').innerHTML='Close';}}</script>";
    }
    return $bfRet;
}

// get server platform
function getServerPlatf($dash=0) {
    $server["is_windows"] = (strtoupper(substr(PHP_OS, 0, 3)) == "WIN");
    $server["is_linux"] = (stristr(PHP_OS, "Linux"));
    $server["is_mac"] = (stristr(PHP_OS, "Darwin"));
    $server["32bit"] = (PHP_INT_SIZE == 4);
    $server["64bit"] = (PHP_INT_SIZE == 8);
    $server["property"] = "Host:";
    foreach ($server as $field => $vtrue) {
        if ($vtrue === true) {
            $server["property"].= str_replace("is_", "&nbsp;", $field) . "&nbsp;";
        }
    }
    $server["property"].= ( $dash == 1 ? "&#8212;&nbsp;" : "");
    return $server;
}

// Needed for sload.php & sinfo.php
if (!function_exists('color_cpu')) {

    function color_cpu($nilai) {
        global $alert_sloadhigh;
        if (!is_numeric($nilai)) {
            return FALSE;
        } else {
            if ($nilai <= 33) {
                $clr = "#3D612C";
            } elseif ($nilai <= 66) {
                $clr = "#FFCC33";
            } else {
                $clr = "#FF0000";
            }
            $nilai = '<b ' . ($alert_sloadhigh ? 'class="r' : 'style="color:' . $clr) . '">' . $nilai . '</b>';
            return $nilai;
        }
    }

}

// age file facebook looks like
function count_age($age) {
    global $L;
    if ($age <= 60)
        return $L->say['less_a_minute'];
    $jam_str = "";
    $jam = floor($age / 3600);
    if ($jam >= 1) {
        $jam_str = ($jam . " " . $L->say['hours'] . " " );
        $age -= $jam * 3600;
    }
    if ($age >= 60) {
        $min = floor($age / 60);
    } else {
        $sec = $age;
    }
    return $jam_str .
    (isset($min) && $min > 0 ? $min . " " . $L->say['minutes'] : "") .
    (isset($sec) && $sec > 0 ? $sec . " " . $L->say['seconds'] : "") .
    ($L->say['ago'] != "" ? " " . $L->say['ago'] : "");
}

// get working time
function cek_worktime($workstart, $workend) {
    global $options;
    $tdebug = false;
    //$zone=3600 * $options["timezone"]; // GMT +7 ~ Indonesia
    //$tn = getdate(strtotime(date("d M Y H:i:s", time() - date("Z") + $zone)));
    $tn = getdate(TIME_NOW);
    $dtstr = " Apr 1983 ";
    $tgl = "14";

    $tnH = $tn["hours"];
    $tnM = $tn["minutes"];
    $tnS = $tn["seconds"];
    if ($tnH < 10
        )$tnH = '0' . $tnH;
    if ($tnM < 10
        )$tnM = "0" . $tnM;
    if ($tnS < 10
        )$tnS = "0" . $tnS;

    $wstart = strtotime($tgl . $dtstr . $workstart);
    $nowUnix = strtotime("$tgl $dtstr $tnH:$tnM:$tnS");
    $ws = explode(":", $workstart);
    $we = explode(":", $workend);

    if ((int) $ws[0] >= (int) $we[0]) {
        $tgl = "15";
        if ((int) $tnH <= $we[0]) {
            $nowUnix = strtotime("$tgl $dtstr $tnH:$tnM:$tnS");
        }
    }
    $wend = strtotime($tgl . $dtstr . $workend);

    if ($tdebug) {
        echo $tn . "<br>" . "$tgl $dtstr $tnH:$tnM:$tnS<br>$nowUnix<br>" . "$workstart-" . $wstart . "-" . $wend . "-$workend";
    }

    if (($nowUnix - $wstart) > 0 && ($wend - $nowUnix) > 0) {
        return true;
    } else {
        return false;
    }
}

// rebuild link download_dir if notin current dir
function relink_path($DL_link, $phpself = "", $spliter = "/", $drname = false) {
    global $PHP_SELF;

    if ($phpself == "") {
        $phpself = (!$PHP_SELF ? $_SERVER["PHP_SELF"] : $PHP_SELF);
    }
    $ddot_len = substr_count($DL_link, '../', 0);

    $rPth = parse_url($phpself);
    if ($phpself != "") {
        $rPth = substr($rPth["path"], 0, strlen($rPth["path"]) - strlen(strrchr($rPth["path"], $spliter)));
    }
    for ($i = 0; $i < $ddot_len; $i++) {
        $rPth = parse_url($rPth);
        $rPth = substr($rPth["path"], 0, strlen($rPth["path"]) - strlen(strrchr($rPth["path"], $spliter)));
    }
    $rPth = ( (substr($rPth, -1) == $spliter) ? substr($rPth, 0, strlen($rPth) - 1) : $rPth);
    $cPath["root"] = $rPth;
    $cPath["download"] = str_replace("../", "", $DL_link);
    return $cPath;
}

// reverse string
function utf8_strrev($str) {
    preg_match_all('/./us', $str, $ar);
    return join('', array_reverse($ar[0]));
}

// check strictly forbidden file in download dir
function checkStrict() {
    global $options;
    $dir = @dir(DOWNLOAD_DIR);
    while (false !== ($file = $dir->read())) {
        if (in_array(strtolower(strrchr($file, ".")), $options['forbidden_filetypes']) && $file != '.htaccess' && $file != '.htpasswd' && $file != 'index.html') {
            @unlink(DOWNLOAD_DIR . $file);
        }
    }
    $dir->close();
}

/**
 * Textarea for debugging variable
 * @param string The variable you want to debug
 * @param int Column for variable display
 * @param int Rows for variable display
 * @param bool Options to continue or not process
 */
function textarea($var, $cols = 200, $rows = 30, $stop = false) {
    $cols = ($cols == 0) ? 200 : $cols;
    $rows = ($rows == 0) ? 30 : $rows;
    echo "\n<br /><textarea cols='$cols' rows='$rows' readonly='readonly'>";
    if (is_array($var)) echo htmlentities(print_r($var, true), ENT_QUOTES);
    else echo htmlentities($var, ENT_QUOTES);
    echo "</textarea><br />\n";
    if ($stop) exit;
}

?>